package org.tpc.printtolls.api;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tpc.printtolls.model.PrintRequest;
import org.tpc.printtolls.model.PrintResult;
import org.tpc.printtolls.service.PrintService;

import java.util.List;

/**
 * 打印组件对外API接口
 * 这是用户使用打印功能的主要入口点
 */
public class PrintAPI {
    
    private static final Logger logger = LoggerFactory.getLogger(PrintAPI.class);
    private final PrintService printService;
    
    public PrintAPI() {
        this.printService = new PrintService();
    }
    
    /**
     * 执行PDF打印任务
     * 
     * @param printerName 打印机名称
     * @param paperWidth  纸张宽度（毫米）
     * @param paperHeight 纸张高度（毫米）
     * @param copies      打印份数
     * @param pdfUrl      PDF文件的URL
     * @return 打印结果
     */
    public PrintResult print(String printerName, double paperWidth, double paperHeight, 
                           int copies, String pdfUrl) {
        
        logger.info("调用打印API - 打印机: {}, 纸张: {}x{}mm, 份数: {}, URL: {}", 
                   printerName, paperWidth, paperHeight, copies, pdfUrl);
        
        PrintRequest request = new PrintRequest(printerName, paperWidth, paperHeight, copies, pdfUrl);
        return printService.print(request);
    }
    
    /**
     * 执行PDF打印任务（高级版本，包含更多参数）
     * 
     * @param printerName 打印机名称
     * @param paperWidth  纸张宽度（毫米）
     * @param paperHeight 纸张高度（毫米）
     * @param copies      打印份数
     * @param pdfUrl      PDF文件的URL
     * @param duplex      是否双面打印
     * @param quality     打印质量（1-4，1最低，4最高）
     * @return 打印结果
     */
    public PrintResult print(String printerName, double paperWidth, double paperHeight, 
                           int copies, String pdfUrl, boolean duplex, int quality) {
        
        logger.info("调用高级打印API - 打印机: {}, 纸张: {}x{}mm, 份数: {}, URL: {}, 双面: {}, 质量: {}", 
                   printerName, paperWidth, paperHeight, copies, pdfUrl, duplex, quality);
        
        PrintRequest request = new PrintRequest(printerName, paperWidth, paperHeight, copies, pdfUrl);
        request.setDuplex(duplex);
        request.setQuality(quality);
        
        return printService.print(request);
    }
    
    /**
     * 使用PrintRequest对象执行打印任务
     * 
     * @param request 打印请求对象
     * @return 打印结果
     */
    public PrintResult print(PrintRequest request) {
        logger.info("使用PrintRequest对象调用打印API: {}", request);
        return printService.print(request);
    }
    
    /**
     * 获取系统中可用的打印机列表
     * 
     * @return 打印机名称列表
     */
    public List<String> getAvailablePrinters() {
        logger.info("获取可用打印机列表");
        List<String> printers = printService.getAvailablePrinters();
        logger.info("找到 {} 台打印机: {}", printers.size(), printers);
        return printers;
    }
    
    /**
     * 检查指定打印机是否可用
     * 
     * @param printerName 打印机名称
     * @return 是否可用
     */
    public boolean isPrinterAvailable(String printerName) {
        if (printerName == null || printerName.trim().isEmpty()) {
            return false;
        }
        
        List<String> availablePrinters = getAvailablePrinters();
        return availablePrinters.contains(printerName);
    }
    
    /**
     * 获取默认打印机名称（如果有的话）
     * 
     * @return 默认打印机名称，如果没有则返回null
     */
    public String getDefaultPrinter() {
        try {
            javax.print.PrintService defaultService = 
                javax.print.PrintServiceLookup.lookupDefaultPrintService();
            
            if (defaultService != null) {
                String defaultPrinter = defaultService.getName();
                logger.info("默认打印机: {}", defaultPrinter);
                return defaultPrinter;
            }
        } catch (Exception e) {
            logger.warn("获取默认打印机时发生异常", e);
        }
        
        logger.info("没有找到默认打印机");
        return null;
    }
    
    /**
     * 预定义的常用纸张尺寸（毫米）
     */
    public static class PaperSize {
        public static final double[] A4 = {210, 297};
        public static final double[] A3 = {297, 420};
        public static final double[] A5 = {148, 210};
        public static final double[] LETTER = {215.9, 279.4};
        public static final double[] LEGAL = {215.9, 355.6};
        
        private PaperSize() {}
    }
    
    /**
     * 便捷方法：使用A4纸张打印
     */
    public PrintResult printA4(String printerName, int copies, String pdfUrl) {
        return print(printerName, PaperSize.A4[0], PaperSize.A4[1], copies, pdfUrl);
    }
    
    /**
     * 便捷方法：使用A3纸张打印
     */
    public PrintResult printA3(String printerName, int copies, String pdfUrl) {
        return print(printerName, PaperSize.A3[0], PaperSize.A3[1], copies, pdfUrl);
    }
    
    /**
     * 便捷方法：使用Letter纸张打印
     */
    public PrintResult printLetter(String printerName, int copies, String pdfUrl) {
        return print(printerName, PaperSize.LETTER[0], PaperSize.LETTER[1], copies, pdfUrl);
    }
}